package demo3;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class Person {
    /*
        @Autowired 自动装配注解
        该注解作用是希望让Spring容器来对这个属性进行初始化，将其管理的一个对象设置到该属性上
        需要注意，该属性必须是Spring容器管理的一个对象。
        那么Spring容器在初始化Person时，才会将Shirt对象设置到这个属性上。建立Person与
        Shirt的依赖关系。


        如果Spring容器在自动装配时抛出异常:NoUniqueBeanDefinitionException
        说明容器找到了多个子类，他们都实现了Clothes接口，无法确定应当将哪个对象设置到这里

        解决装配冲突:
        1:确保Clothes接口的实现类只有一个被Spring容器管理
        2:可以为多个Clothes的实现类在添加@Component注解时，通过注解参数为其定义组件名
          此时这里需要让Spring进行自动装配置，再添加注解@Qualifier,来通过组件名进行装配。

          例如:当前代码@Qualifier("summer")

          Spring容器创建时扫描demo3包，发现了两个实现了Clothes接口的类:
          @Component("summer")      <----可以匹配这里@Qualifier("summer")
          public class Shirt{...}

          @Component("winter")
          public class Sweater{...}

          此时容器会将Shirt实例装配到这里

     */
    @Autowired//@Autowired注解表示将当前属性注入到IoC容器中 自动装配
   //private Shirt shirt;//Person需要使用Shirt,将其定义成属性
   // private Sweater sweater;
    @Qualifier("winter")
    private Clothes clothes;
    public void play(){

      //  Shirt shirt = new Shirt();
       // shirt.wear();
       // sweater.wear();
        clothes.wear();
        System.out.println("玩手机");
    }
}
